package com.munichosica.myapp.controller.Producto;

import java.io.InputStream;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.Part;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.munichosica.myapp.dto.Archivo;
import com.munichosica.myapp.dto.FotoJF;
import com.munichosica.myapp.dto.Producto;
import com.munichosica.myapp.dto.Usuario;
import com.munichosica.myapp.exceptions.ArchivoDaoException;
import com.munichosica.myapp.exceptions.CategoriaDaoException;
import com.munichosica.myapp.exceptions.ProductoDaoException;
import com.munichosica.myapp.factory.ArchivoDaoFactory;
import com.munichosica.myapp.factory.CategoriaDaoFactory;
import com.munichosica.myapp.factory.ProductoDaoFactory;
import com.munichosica.myapp.util.FileUtil;

@Controller
@RequestMapping("/Producto")
public class ProductoController {

	private Logger logger=Logger.getLogger(ProductoController.class);
	
	@RequestMapping(value="Procesar.htm", method=RequestMethod.POST)
	public @ResponseBody String procesar(HttpServletRequest request,Producto producto){
		HttpSession session=request.getSession(true);
		Usuario usuario=(Usuario) session.getAttribute("USUARIO");
		FotoJF foto=(FotoJF) session.getAttribute("FOTO_PRODUCTO");
		try {
			if(foto!=null && producto.getFotogrande().getArccodigoI() !=null && producto.getFotogrande().getArccodigoI() >0 ){
				Archivo archivo=new Archivo();
				archivo.setArccodigoI(producto.getFotogrande().getArccodigoI());
				archivo.setArcnombreV(foto.getFotNombre());
				archivo.setArcblobB(foto.getFotArchivo());
				archivo.setArcextensionC(foto.getFotExtension());
				archivo.setArcusuarioregistraV(usuario.getUsuusuarioV());
				archivo.setArcipV(request.getRemoteAddr());
				ArchivoDaoFactory.create().modificar(archivo);
			}else if(foto !=null){
				Archivo archivo=new Archivo();
				archivo.setArcnombreV(foto.getFotNombre());
				archivo.setArcblobB(foto.getFotArchivo());
				archivo.setArcextensionC(foto.getFotExtension());
				archivo.setArcusuarioregistraV(usuario.getUsuusuarioV());
				archivo.setArcipV(request.getRemoteAddr());
				ArchivoDaoFactory.create().insertar(archivo);
				if(archivo.getArccodigoI()!=null){
					producto.setFotogrande(archivo);
				}
			}
			
			if(producto.getProcodigoI()==0){
				producto.setProcodbarraV(CategoriaDaoFactory.create().codigoBarra(producto.getCategoria().getCatcodigoI()));
				producto.setProusuarioregistraV(usuario.getUsuusuarioV());
				ProductoDaoFactory.create().insertar(producto);
			}else{
				if(producto.getProcodbarraV()==null||producto.getProcodbarraV().trim().length()<1){
					producto.setProcodbarraV(CategoriaDaoFactory.create().codigoBarra(producto.getCategoria().getCatcodigoI()));
				}
				producto.setProusuarioactualizaV(usuario.getUsuusuarioV());
				ProductoDaoFactory.create().modificar(producto);
			}
		} catch (ProductoDaoException | CategoriaDaoException | ArchivoDaoException e) {
			logger.error(e.getMessage(), e);
		}
		return String.valueOf(producto.getProcodigoI());
	}
	
	@RequestMapping(value="Listar.htm", method=RequestMethod.POST)
	public @ResponseBody List<Producto> listar(@RequestParam("criterio") String criterio,
			@RequestParam("texto") String texto, @RequestParam("estado") String estado){
		logger.info("Ingreso a Producto/Listar.htm");
		List<Producto> list=null;
		try {
			list=ProductoDaoFactory.create().listarPorCriterio(criterio, texto, estado);
		} catch (ProductoDaoException e) {
			logger.error(e.getMessage(), e);
		}
		return list;
	}
	
	@RequestMapping(value="Obtener.htm", method=RequestMethod.GET)
	public @ResponseBody Producto obtener(HttpServletRequest request,@RequestParam("codigo") Integer codigo){
		Producto producto=null;
		try {
			producto=ProductoDaoFactory.create().obtener(codigo);
			if(producto.getFotogrande().getArccodigoI()!=null && producto.getFotogrande().getArccodigoI() > 0 ){
				producto.setFotogrande(ArchivoDaoFactory.create().obtener(producto.getFotogrande().getArccodigoI()));
				String nombreArchivo;
				try {
					nombreArchivo = FileUtil.createTempFile(request, producto.getFotogrande().getArcextensionC() , FileUtil.deCompress(producto.getFotogrande().getArcblobB()) );
					producto.getFotogrande().setArcnombreV(nombreArchivo);
				} catch (Exception e) {
					logger.error(e.getMessage(), e);
				}
			}
		} catch (ProductoDaoException | ArchivoDaoException e) {
			logger.error(e.getMessage(), e);
		}
		return producto;
	}
	
	@RequestMapping(value="Eliminar.htm", method=RequestMethod.GET)
	public void eliminar(HttpServletRequest request,@RequestParam("codigo") Integer codigo){
		HttpSession session=request.getSession(true);
		Usuario usuario=(Usuario) session.getAttribute("USUARIO");
		Producto producto=new Producto();
		producto.setProcodigoI(codigo);
		producto.setProusuarioactualizaV(usuario.getUsuusuarioV());
		try {
			ProductoDaoFactory.create().eliminar(producto);
		} catch (ProductoDaoException e) {
			logger.error(e.getMessage(), e);
		}
	}
	
	@RequestMapping(value="Foto.htm", method=RequestMethod.POST, headers="content-type=multipart/form-data")
	public @ResponseBody String agregarFoto(HttpServletRequest request){
		logger.info("Ingreso a Producto/Foto.htm");
		HttpSession session=request.getSession(true);
		FotoJF foto=(FotoJF) session.getAttribute("FOTO_PRODUCTO");
		if(foto==null){
			foto=new FotoJF();
			session.setAttribute("FOTO_PRODUCTO", foto);
			logger.info("Se creo session.setAttribute('FOTO_PRODUCTO', foto);");
		}
		String nombreArchivo="";
		try {
			for(Part part:request.getParts()){
				InputStream inputStream=request.getPart(part.getName()).getInputStream();
				int i=inputStream.available();
				byte[] bs=new byte[i];
				inputStream.read(bs);
				if(part.getName().equals("fileFoto")){
					String filename=FileUtil.getFilename(part);
					foto.setFotNombre(filename);
					foto.setFotArchivo(FileUtil.compress(bs));
					foto.setFotExtension(FileUtil.getExtension(filename));
					nombreArchivo=FileUtil.createTempFile(request, foto.getFotNombre() , bs);
				}
			}
		} catch (Exception e) {
			logger.error(e.getMessage());
		} 
		return nombreArchivo;
	}
}
